/*
 *	$Id: vizobj.h 122 2009-06-11 09:31:45Z wabsie $
 */

#ifndef _VIZOBJ_H
#define	_VIZOBJ_H

#include <agar/core.h>	// Agar
#include <agar/gui.h>	// ...

#include <cstdio>		// STL udgave af stdio.h: printf og FILENAME_MAX
#include <vector>		// STL vector
#include <string>		// STL string
#include <map>			// STL map
#include "matematik.h"	// matematik
#include "plotter.h"	// plotter
#include "emobj.h"		// emobjekt
#include "parser.h"		// parser

using namespace std;	// STL-stuff ligger namespace 'std'


inline static void setPixmapColor(AG_Pixmap *pix, Uint32 col, int w = 1, int h = agTextFontHeight);

class vizobj
{
public:
	vizobj(const char* _navn);
	~vizobj();
	void		giveFocus();		// Fokusér dette viz-vindue
	void		close();			// Lukker viz-vinduet ned
	char*		getName();
	bool		isWinEqual(AG_Window *arg);
	void		plotwrapper();		// Opdater plottet
	void		removeObj(int index);	// Fjerner index angivet objekt fra vem

	bool		closed;				// True = viz-vinduet er lukket ned
	Medium		vem;				// Indeholder vores em-objekter

private:
	static int	cnt;				// Tæl antallet af oprettede viz-vinduer

	AG_Window	*vizWin;			// Selve viz-vinduet
	char		navn[FILENAME_MAX];	// Filnavnet for vinduet

	AG_Box		*controlsBox, *plotBox;

	AG_Pixmap	*plotPix;			// Viser plottet

	AG_Pixmap   *farvePix;			// Viser farveskalaen
	bool		autoBool;			// Binded til Auto-farve knappen
	AG_Numerical *farveMinNum;		// Farveskalaens maksimum i dB
	double		farveMinDbl;		// Binded til farveMinNum
	AG_Numerical *farveMaxNum;		// Farveskalaens minium i dB
	double		farveMaxDbl;		// Binded til farveMaxNum


	AG_UCombo	*fieldUcom;
	static const char *felter[];
	enum fS {intet=-1,E=0,V=1,B=2,A=3} fieldSelection; // Index for nuværende valgte felt

	static const char *radioItems[];
	int			dimInt;				// Binded til dimensionsradioknapperne

	AG_Numerical *zeropotNum[3];	// Bokse til ændring af nul-potentialepunktet (disables for E og B)
									// vem.nul_potentiale er binded direkte hertil

	char		sliceStr[20];		// Binded til slice tekstboksen
	char		cslice;				// Z'et i "z = 0"
	float		nslice;				// Nullet i "z = 0"
	plotter::slices	slice;

	struct {
		AG_Textbox	*Text;			// Tekstboksen
		AG_Pixmap	*Pix;			// Lille lodret streg, angiver farven af aksen
		char		str[20];		// Binded til tekstboksen
		float		min;			// Parset min-værdi ud fra str
		float		max;			// Parset max-værdi ud fra str
	} axis[3];

	AG_Slider	*rotSlider[3];		// Sliders til rotation (vises kun i 3D mode)
	AG_Label	*rotLbl[3];
	int         rotValue[3];


	AG_UCombo	*objectUcom;
	int         objectSelection;	// Index for nuværende valgte objekt i vem

	AG_Numerical *styrkeNum;		// Boks til ændring af styrke for valgt objekt
	double		styrkeDbl;			// Binded til styrkeNum AG_Numerical

	AG_Numerical *offNum[3];		// Bokse til offset/translation
	double		offDbl[3];			// Binded hhv til hver off AG_Numerical

	AG_Numerical *retNum[3];		// Bokse til orientering (disables for punktladning)
	double		retDbl[3];			// Binded hhv til hver orient AG_Numerical

	// Prototype deklarationer
	void draw();
	void allowObjManip();			// Aktiverer bokse så valgt objekt kan ændres
	void disallowObjManip();		// Deaktiverer bokse
	static void fieldSelected(AG_Event *event);
	static void fieldDimension(AG_Event *event);
	static void fieldSlice(AG_Event *event);
	static void objectSelected(AG_Event *event);
	static void ucomboUpdate(AG_Event *event);
	static void styrkeEdit(AG_Event *event);
	static void winClosed(AG_Event *event);
	static void editAxis(AG_Event *event);
	static void offsetUpdate(AG_Event *event);
	static void orientUpdate(AG_Event *event);
	static void genericPlotUpdate(AG_Event *event);
};


/*
 * Disse funktioner er akkurat ikke med den binære udgave
 * af libAgar vi bruger. Derfor er de importeret fra seneste Agar rev.
 * Kilde: Revision 8189, http://svn.csoft.org/agar/trunk/gui/widget.h
 */
static inline void AG_WidgetHide(void *wid)
{
	AG_ObjectLock(wid);
	AGWIDGET(wid)->flags |= AG_WIDGET_HIDE;
	AG_ObjectUnlock(wid);
}
static inline void AG_WidgetShow(void *wid)
{
	AG_ObjectLock(wid);
	AGWIDGET(wid)->flags &= ~(AG_WIDGET_HIDE);
	AG_ObjectUnlock(wid);
}

#endif	/* _VIZOBJ_H */

